import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;

public class RandomDemo {

    protected static void demoLogic() {
        // https://blog.csdn.net/shibai906/article/details/89646090

        DateTimeDemo.logTs("Math.random");
        for(int i=0; i<10; ++i) {
            //Math.random() 随机生成一个double类型[0，1)
            System.out.println(i + ", Math.random "+Math.random());
            // 多次运行，发现 Math.random 返回的序列是不同的
        }

        DateTimeDemo.logTs("Random");
        Random intRand = new Random();
        intRand.setSeed(30000l);
        for(int i=0; i<10; ++i) {
            //intRand.nextInt(max) 随机生成一个int类型[0，max)
            System.out.println(i + ", Random "+intRand.nextInt(101));
            // 多次运行，发现 如果没有 intRand.setSeed(30000l); intRand.nextInt 返回的序列是不同的
            // 多次运行，发现 如果执行 intRand.setSeed(30000l); intRand.nextInt 返回的序列是 完全相同的
        }

        Random intRand2 = new Random(); // 和 intRand 返回相同的 随机数序列
        intRand2.setSeed(30000l);
        for(int i=0; i<10; ++i) {
            //intRand.nextInt(max) 随机生成一个int类型[0，max)
            System.out.println(i + ", Random2 "+intRand2.nextInt(101));
            // 多次运行，发现 如果没有 intRand.setSeed(30000l); intRand.nextInt 返回的序列是不同的
            // 多次运行，发现 如果执行 intRand.setSeed(30000l); intRand.nextInt 返回的序列是 完全相同的
        }


        DateTimeDemo.logTs("SecureRandom");
        try {
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            //secureRandom.setSeed(30000l);
            for(int i=0; i<10; ++i) {
                //intRand.nextInt(max) 随机生成一个int类型[0，max)
                System.out.println(i + ", secureRandom "+secureRandom.nextInt(101));
                // 多次运行，发现 如果没有 intRand.setSeed(30000l); intRand.nextInt 返回的序列是不同的
                // 多次运行，发现 如果执行 intRand.setSeed(30000l); intRand.nextInt 返回的序列是 完全相同的
            }

            // 和 secureRandom 返回 不相同的 随机数序列，看起来就这点区别于 Random
            SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG");
            //secureRandom2.setSeed(30000l);
            for(int i=0; i<10; ++i) {
                //intRand.nextInt(max) 随机生成一个int类型[0，max)
                System.out.println(i + ", secureRandom2 "+secureRandom2.nextInt(101));
                // 多次运行，发现 如果没有 intRand.setSeed(30000l); intRand.nextInt 返回的序列是不同的
                // 多次运行，发现 如果执行 intRand.setSeed(30000l); intRand.nextInt 返回的序列是 完全相同的
            }
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

}
